--- 模块功能：MQTT客户端处理框架
-- @author openLuat
-- @module mqtt.mqttTask
-- @license MIT
-- @copyright openLuat
-- @release 2018.03.28
module(..., package.seeall)

require "misc"
require "mqtt"
require "mqttInMsg"
require "nvm"
require "logGenerator"
require "mqttOutMsg"
-- 初始化nvm获取配置参数
nvm.init("config.lua", true)
--参数初始化
local ready, slen, orgId, typeId, version = false, string.len, nvm.get("info")[4], nvm.get("info")[3],
    nvm.get("version")
-- 组装主题列表
local function assembleTopic()
    local topicList = {}
    local centerNameList = string.split(nvm.get("centerName"), ",")
    print("centerNameList", centerNameList[1], centerNameList[2])
    topicList["action/" .. typeId] = 0
    print("topicList", topicList["action/16"])
    for i = 1, #centerNameList, 1 do
        topicList["quake/" .. centerNameList[i]] = 0
        topicList["quake/iot/" .. centerNameList[i]] = 0
    end
    print("topicList2", topicList["quake/zfhTest"])
    print("topicList All", table.concat(topicList))
    return topicList
end

--- MQTT连接是否处于激活状态
-- @return 激活状态返回true，非激活状态返回false
-- @usage mqttTask.isReady()
function isReady() return ready end

-- 启动MQTT客户端任务
function startMQTTClient(clientNo)
    sys.taskInit(function()
        local retryConnectCnt, retryStartDevCnt = 0, 0
        while true do
            if not socket.isReady() then
                retryConnectCnt = 0
                -- 等待网络环境准备就绪，超时时间是5分钟
                sys.waitUntil("IP_READY_IND", 300000)
                log.info("retryStartDevCnt加1")
                retryStartDevCnt = retryStartDevCnt + 1
            end
            if socket.isReady() then
                retryStartDevCnt = 0
                -- 创建一个MQTT客户端
                log.info("clientNo", clientNo)
                local will = "{" .. "clientNo:'" .. clientNo .. "',msg:'0'" .. "}"
                will = crypto.aes_encrypt("ECB", "PKCS5", will, "keson-123abcdefg")
                will = crypto.base64_encode(will, slen(will))
                local mqttClient = mqtt.client(clientNo, 300, "admin", "keson-123", nil,
                    {
                        qos = 0,
                        retain = 0,
                        topic = "online",
                        payload = will
                    }, "3.1")
                local online = "{" .. "clientNo:'" .. clientNo .. "',orgId:'" ..
                    orgId .. "',type:" .. typeId .. ",version:'" ..
                    version .. "',msg:'1'" .. "}"
                online = crypto.aes_encrypt("ECB", "PKCS5", online,
                    "keson-123abcdefg")
                online = crypto.base64_encode(online, slen(online))
                -- 阻塞执行MQTT CONNECT动作，直至成功
                -- 如果使用ssl连接，打开mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"})，根据自己的需求配置
                -- mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"})
                if mqttClient:connect("47.94.80.3", 61613, "tcp") then
                    retryConnectCnt = 0
                    ready = true
                    mqttClient:publish("online", online, 0)
                    -- 订阅主题
                    if mqttClient:subscribe(assembleTopic()) then
                        -- 循环处理接收和发送的数据
                        while true do
                            if not mqttInMsg.proc(mqttClient) then
                                log.error("mqttTask.mqttInMsg.proc error")
                                break
                            end
                            if not mqttOutMsg.proc(mqttClient) then log.error("mqttTask.mqttOutMsg proc error") break end
                        end
                    end
                    ready = false
                else
                    retryConnectCnt = retryConnectCnt + 1
                end
                -- 断开MQTT连接
                mqttClient:disconnect()
                if retryConnectCnt >= 5 then
                    link.shut()
                    retryConnectCnt = 0
                end
                sys.wait(500)
            else
                -- 进入飞行模式，20秒之后，退出飞行模式
                net.switchFly(true)
                sys.wait(20000)
                net.switchFly(false)
            end
            if retryStartDevCnt >= 7 then
                retryStartDevCnt = 0
                sys.restart("重启设备！")
            end
        end
    end)
end
